package com.mrx.commons.util.asserts;

import com.mrx.commons.config.Constant;
import com.mrx.commons.exception.BusinessException;

import static com.mrx.commons.config.ResultCodeConstant.*;

/**
 * @author : 肖康宁
 * @since : 2022-12-09 14:54
 **/
public enum Asserts implements IAssert {

    // 通用状态码
    NOT_FOUND(404, "找不到请求的资源"),

    // 自定义状态码
    // 成功 状态码区间 20000 - 39999
    SUCCESS(SUCCESS_CODE + SUCCESS_CODE_OFFSET, "操作成功"),
    REGISTER_SUCCESS(SUCCESS_CODE + SUCCESS_CODE_OFFSET, "注册成功"),
    LOGIN_SUCCESS(SUCCESS_CODE + SUCCESS_CODE_OFFSET, "登录成功"),

    // 失败 状态码区间 40000 - 59999
    FAILURE(ERROR_CODE + ERROR_CODE_OFFSET, "出现错误"),
    USER_NAME_EXISTS(ERROR_CODE + ERROR_CODE_OFFSET, "用户名已存在"),
    REGISTER_FAILURE(ERROR_CODE + ERROR_CODE_OFFSET, "注册失败"),
    ACCESS_DENIED(ERROR_CODE + ERROR_CODE_OFFSET, "权限不足"),
    SERVER_ERROR(ERROR_CODE + ERROR_CODE_OFFSET, "服务器内部错误"),
    PARAMETER_ERROR(ERROR_CODE + ERROR_CODE_OFFSET, "参数有误"),
    TOKEN_EXPIRED(ERROR_CODE + ERROR_CODE_OFFSET, Constant.TOKEN_INVALID),
    METHOD_NOT_ALLOWED(ERROR_CODE + ERROR_CODE_OFFSET, "不支持该请求方法"),
    LOGIN_FAILURE(ERROR_CODE + ERROR_CODE_OFFSET, "登录失败, 用户名或密码错误"),
    FILE_NAME_ERROR(ERROR_CODE + ERROR_CODE_OFFSET, "文件名错误"),
    UPLOAD_FILE_FAILURE(ERROR_CODE + ERROR_CODE_OFFSET, "上传文件失败"),
    GET_FILE_INFO_FAILURE(ERROR_CODE + ERROR_CODE_OFFSET, "获取文件信息失败"),
    FILE_NOT_FOUND(ERROR_CODE + ERROR_CODE_OFFSET, "找不到文件"),
    USER_NOT_EXISTS(ERROR_CODE + ERROR_CODE_OFFSET, "用户不存在"),
    CAPTCHA_ERROR(ERROR_CODE + ERROR_CODE_OFFSET, "验证码输入错误"),
    USER_EXISTS(ERROR_CODE + ERROR_CODE_OFFSET, "用户名已被使用"),
    POST_NOT_EXISTS(ERROR_CODE + ERROR_CODE_OFFSET, "帖子不存在"),
    PASSWORD_ERROR(ERROR_CODE + ERROR_CODE_OFFSET, "密码错误"),
    OLD_PASSWORD_ERROR(ERROR_CODE + ERROR_CODE_OFFSET, "旧密码错误"),
    TWO_FA_CODE_ERROR(ERROR_CODE + ERROR_CODE_OFFSET, "2FA 密码错误"),
    SIGNING_FAILURE(ERROR_CODE + ERROR_CODE_OFFSET, "签到失败, 一天只能签到一次"),
    CAN_NOT_DELETE_ME(ERROR_CODE + ERROR_CODE_OFFSET, "删除失败, 无法删除当前登录的账号"),
    CAN_NOT_UPDATE_MY_ROLE(ERROR_CODE + ERROR_CODE_OFFSET, "编辑失败, 无法编辑当前登录的账号"),
    CAN_NOT_DELETE_REFERENCED_TAG(ERROR_CODE + ERROR_CODE_OFFSET, "删除失败, 该板块下还有帖子"),
    EDIT_FAILED_NAME_NOT_EMPTY(ERROR_CODE + ERROR_CODE_OFFSET, "编辑失败, 名称不能为空"),
    TAG_ALREADY_EXISTS(ERROR_CODE + ERROR_CODE_OFFSET, "已存在相同 名称 的板块"),
    CAN_ONLY_DELETE_YOURSELF_PHOTO(ERROR_CODE + ERROR_CODE_OFFSET, "只能删除你自己的照片!"),
    PHOTO_NOT_EXIST(ERROR_CODE + ERROR_CODE_OFFSET, "照片不存在!"),
    RATE_LIMITED(ERROR_CODE + ERROR_CODE_OFFSET, "接口访问过于频繁!"),
    MAIL_NOT_BIND(ERROR_CODE + ERROR_CODE_OFFSET, "未绑定邮箱!"),
    RECOVERY_CODE_ERROR(ERROR_CODE + ERROR_CODE_OFFSET, "验证码错误!"),
    BIND_MAIL_FAILED(ERROR_CODE + ERROR_CODE_OFFSET, "绑定邮箱失败, 服务器异常!"),
    BIND_MAIL_FAILED_KEY_ERROR(ERROR_CODE + ERROR_CODE_OFFSET, "绑定邮箱失败, key 错误"),
    BIND_MAIL_FAILED_NO_KEY_FOUND(ERROR_CODE + ERROR_CODE_OFFSET, "绑定邮箱失败, 请先获取验证码"),
    MAIL_ERROR(ERROR_CODE + ERROR_CODE_OFFSET, "邮箱不合法!"),
    NO_SUCH_USER_WITH_THIS_MAIL(ERROR_CODE + ERROR_CODE_OFFSET, "该邮箱没有绑定用户!");

    public final int code;

    public final String msg;

    Asserts(int code, String msg) {
        this.msg = msg;
        this.code = code;
    }

    @Override
    public int getCode() {
        return code;
    }

    @Override
    public String getMsg() {
        return msg;
    }

    public BusinessException getException(String msg) {
        return new BusinessException(msg, this);
    }

    @Override
    public BusinessException getException() {
        return getException(msg);
    }

}
